package com.yungu.swift.order.service;

import com.github.miemiedev.mybatis.paginator.domain.PageList;
import com.yungu.swift.base.ResponseData;
import com.yungu.swift.base.model.api.ApiPageParam;
import com.yungu.swift.base.service.BaseService;
import com.yungu.swift.order.model.dto.OrderDetailDto;
import com.yungu.swift.order.model.dto.OrderDto;
import com.yungu.swift.order.model.dto.OrderFareDto;
import com.yungu.swift.order.model.param.ApiOrderListParam;
import com.yungu.swift.order.model.param.ApiOrderNoAnswerCancelParam;
import com.yungu.swift.order.model.vo.*;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * Copyright © 厦门云谷互联信息有限公司 2018-2020 All Right Reserved
 * <p>
 * 订单业务逻辑处理接口
 *
 * @author Zerrion
 * @version 1.0.0-RELEASE
 * @since 2018-07-03 15:24
 */
public interface OrderService extends BaseService<OrderDto> {

    /**
     * 保存订单信息
     *
     * @param orderDto
     * @param orderDetailDto
     * @param orderFareDto
     * @return
     */
    ResponseData<String> saveOrderInfo(OrderDto orderDto, OrderDetailDto orderDetailDto, OrderFareDto orderFareDto);

    /**
     * 获取订单的关联的详情
     *
     * @param uuid 参数
     * @return AjaxList
     */
    ResponseData<JsonOrderDetailVo> getOrderDetail(String uuid, String driverUuid);

    /**
     * 乘客查找已完成的订单（不包括无人接听取消的订单）
     *
     * @param orderListParam 订单列表参数
     * @return List
     */
    ResponseData<List<JsonOrderListVo>> queryOrderDone(ApiOrderListParam orderListParam);

    /**
     * 乘客查找已完成的可开票订单（不包括无人接听取消的订单）
     *
     * @param apiPageParam 参数
     * @return List
     */
    ResponseData<List<JsonOrderListVo>> queryBillOrder(ApiPageParam apiPageParam);

    /**
     * 乘客查找正在进行中的订单
     *
     * @param orderListParam 乘客订单分页参数
     * @return List
     */
    ResponseData<List<JsonOrderListVo>> queryOrderDoing(ApiOrderListParam orderListParam);

    /**
     * 司机查找正在进行中的订单
     *
     * @param orderListParam 司机订单分页参数
     * @return List
     */
    ResponseData<List<JsonOrderListVo>> queryOrderDriDoing(ApiOrderListParam orderListParam);

    /**
     * 去接乘客
     *
     * @param orderUuid  参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> updPickUpPas(String orderUuid, String uploadText);

    /**
     * 司机到达上车地点
     *
     * @param orderUuid  参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> updDepart(String orderUuid, String uploadText);

    /**
     * 司机接到乘客
     *
     * @param orderUuid  参数
     * @param waitMile   参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> updGeton(String orderUuid, Double waitMile, String uploadText);

    /**
     * 出租车司机到达目的地
     *
     * @param orderUuid  参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> taxiUpdArrive(String orderUuid, String uploadText);

    /**
     * 乘客首页获取订单状态
     *
     * @param uuid       参数
     * @param typeModule 业务类型
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> getOrderStatus(String uuid, Integer typeModule);

    /**
     * 司机首页获取订单状态
     *
     * @param uuid       司机uuid
     * @param typeModule 业务类型
     * @return AjaxList
     */
    ResponseData<Map<String, Object>> getDriOrderStatus(String uuid, Integer typeModule);

    /**
     * [乘客] 行程未确定取消订单（包括乘客主动取消和系统取消）
     *
     * @param cancelParam
     * @return
     */
    ResponseData<Boolean> noConfirmCancel(ApiOrderNoAnswerCancelParam cancelParam);

    /**
     * [乘客] 确定行程后乘客取消订单
     *
     * @param orderUuid 参数
     * @param cancelMsg 参数
     * @return AjaxList
     */
    ResponseData<Boolean> pasConfirmCancel(String orderUuid, String cancelMsg);

    /**
     * [司机] 司机取消订单接口
     *
     * @param orderUuid  参数
     * @param cancelMsg  参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> driConfirmCancel(String orderUuid, String cancelMsg, String uploadText);

    /**
     * 解除司机锁定
     *
     * @param driverUuid 司机 uuid
     * @return
     */
    ResponseData<Void> removeDriverLock(String driverUuid);

    /**
     * 司机保存金额（更改主表状态）
     *
     * @param orderUuid  参数
     * @param actualFare 参数
     * @param otherFare  参数
     * @return AjaxList
     */
    ResponseData<Boolean> updOrderFare(String orderUuid, Double actualFare, Double otherFare);

    /**
     * 获取指定司机上班时间的总订单数
     *
     * @param params 参数
     * @return Integer
     */
    ResponseData<Integer> getCount(Map<String, Object> params);

    /**
     * 根据实际接单司机actualDriverUuid字段查询订单列表，按出发时间降续排列
     *
     * @param map       参数
     * @param pageParam 参数
     * @return PageList
     */
    ResponseData<PageList<JsonOrderListVo>> queryPageList(Map<String, Object> map, ApiPageParam pageParam);

    /**
     * 统计司机订单数据
     *
     * @param driUuid
     * @param type
     * @param startDate
     * @param endDate
     * @return
     */
    ResponseData<ApiDriverOrderVo> statisticDriverOrder(String driUuid, Integer type, Date startDate, Date endDate);

    /**
     * 更新状态
     *
     * @param orderDto   参数
     * @param subStatus  参数
     * @param mainStatus 参数
     */
    void updateOrderStatus(OrderDto orderDto, Integer subStatus, Integer mainStatus);

    /**
     * 出租车司机端 首页
     *
     * @param driverUuid 参数
     * @param appid      参数
     * @return Map
     */
    ResponseData<Map<String, Object>> queryHomePage(String driverUuid, String appid);

    /*==================专车业务====================*/

    /**
     * 专/快车：到达目的地
     *
     * @param orderUuid     订单 uuid
     * @param tripDistance  订单行程信息
     * @param tripRecording 订单行程录音信息
     * @param destination   日租/半日租 订单目的地信息
     * @param uploadText    定位点信息
     * @return AjaxList
     */
    ResponseData<Boolean> updArrive(String orderUuid, Double tripDistance, String tripRecording, OrderDetailDto destination, String uploadText);

    /**
     * 专车：司机确认费用
     *
     * @param orderUuid  参数
     * @param uploadText 参数
     * @return AjaxList
     */
    ResponseData<Boolean> confirmFare(String orderUuid, String uploadText);

    /**
     * 司机首页半小时以内预约单提醒
     *
     * @param driverUuid 参数
     * @return Map
     */
    ResponseData<Map<String, Object>> getAppointmentToBeStart(String driverUuid);


    /*=====================公用方法========================================================================*/

    /**
     * 获取司机所有未出发预约单
     *
     * @param paraMap 参数
     * @return List
     */
    ResponseData<List<JsonOrderListVo>> getAppointmentList(Map<String, Object> paraMap);

    /**
     * 获取司机可抢预约单数量
     *
     * @param paraMap 参数
     * @return Map
     */
    ResponseData<Map<String, Object>> getFreshAppointmentCount(Map<String, Object> paraMap);

    /**
     * 获取司机可抢预约单明细 todo:待优化
     *
     * @param paraMap 参数
     * @return AjaxList
     */
    ResponseData<List<JsonOrderListVo>> getFreshAppointmentDetail(Map<String, Object> paraMap);


    /**
     * 获取3天内有取消订单的乘客的所有订单
     * （待定：根据乘客和创建时间倒序）
     *
     * @return List
     */
    ResponseData<List<OrderDto>> getCancelPassengerOrder(String appid);

    /**
     * 获取专快出租订单详情
     */
    ResponseData<ApiOrderInfoVo> getOrderInfo(String orderUuid);

    /**
     * 外部调用订单抽成
     *
     * @param payVo
     * @return
     */
    ResponseData<Void> extFareSettlement(PayVo payVo);

    /**
     * 获取未评价订单
     *
     * @param passengerUuid
     * @return
     */
    ResponseData<Map<String, Object>> getNoEvaluationOrder(String passengerUuid);
}
